// 定义一些策略，例如 created，beforeCreated 等，不需要写大量的if判断
const strats = {}
const LIFECYCLE = [
    "beforeCreated",
    "created"
]

LIFECYCLE.forEach(key => {
    strats[key] = function (p, c) {
        if (c) {
            if (p) {
                return p.concat(c)
            } else {
                return [c]
            }
        } else {
            return p
        }
    }
})

// 合并组件
strats.components = function (parentVal, childVal){
    const res = Object.create(parentVal)
    if(childVal){
        for (const key in childVal) {
            res[key] = childVal[key]
        }
    }
    return res
}

// 合并属性的方法
export function mergeOptions(parent, child) {
    const options = {}
    // 先获取父亲的值
    for (const key in parent) {
        mergeField(key)
    }
    for (const key in child) {
        // 如果父亲里面没有这个子属性，在进行合并子的
        /**
         * 示例：父亲：{a:1} 儿子:{a:2}
         *      儿子中也有父亲的属性a，所以不会走儿子中的合并方法，但是在取值的时候，优先取的是儿子身上的属性值
         *      所以合并到一个对象中时，儿子会覆盖父亲
         */
        if (!parent.hasOwnProperty(key)) {
            mergeField(key)
        }
    }

    function mergeField(key) {
        if (strats[key]) {
            // {created:fn} {}
            // 合并声明周期上的方法，例如：beforeCreated,created
            options[key] = strats[key](parent[key], child[key])
        } else {
            // 先拿到儿子的值
            options[key] = child[key] || parent[key]
        }
    }

    return options
}